home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / dev / lang / Python16_Src.lha / Python16_Source / Parser / bitset.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-03  |  1009 b   |  76 lines

  1. /* Bitset primitives used by the parser generator */
  2.  
  3. #include "pgenheaders.h"
  4. #include "bitset.h"
  5.  
  6. bitset
  7. newbitset(nbits)
  8.     int nbits;
  9. {
  10.     int nbytes = NBYTES(nbits);
  11.     bitset ss = PyMem_NEW(BYTE, nbytes);
  12.     
  13.     if (ss == NULL)
  14.         Py_FatalError("no mem for bitset");
  15.     
  16.     ss += nbytes;
  17.     while (--nbytes >= 0)
  18.         *--ss = 0;
  19.     return ss;
  20. }
  21.  
  22. void
  23. delbitset(ss)
  24.     bitset ss;
  25. {
  26.     PyMem_DEL(ss);
  27. }
  28.  
  29. int
  30. addbit(ss, ibit)
  31.     bitset ss;
  32.     int ibit;
  33. {
  34.     int ibyte = BIT2BYTE(ibit);
  35.     BYTE mask = BIT2MASK(ibit);
  36.     
  37.     if (ss[ibyte] & mask)
  38.         return 0; /* Bit already set */
  39.     ss[ibyte] |= mask;
  40.     return 1;
  41. }
  42.  
  43. #if 0 /* Now a macro */
  44. int
  45. testbit(ss, ibit)
  46.     bitset ss;
  47.     int ibit;
  48. {
  49.     return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0;
  50. }
  51. #endif
  52.  
  53. int
  54. samebitset(ss1, ss2, nbits)
  55.     bitset ss1, ss2;
  56.     int nbits;
  57. {
  58.     int i;
  59.     
  60.     for (i = NBYTES(nbits); --i >= 0; )
  61.         if (*ss1++ != *ss2++)
  62.             return 0;
  63.     return 1;
  64. }
  65.  
  66. void
  67. mergebitset(ss1, ss2, nbits)
  68.     bitset ss1, ss2;
  69.     int nbits;
  70. {
  71.     int i;
  72.     
  73.     for (i = NBYTES(nbits); --i >= 0; )
  74.         *ss1++ |= *ss2++;
  75. }
  76.